package main

// 导入必要的包
import (
	"flag"
	"fmt"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

// 全局变量定义
var (
	endpint     = "oss-cn-beijing.aliyuncs.com" // OSS服务的Endpoint
	acessKey    = "xx"                          // OSS的AccessKey ID
	acessSecret = "xx"                          // OSS的AccessKey Secret
	bucketName  = "devcloud-station"            // OSS的Bucket名称

	// 用户需要传递的参数,
	// 期望用户自己输入(CLI/GUI)
	uploadFile = "" // 待上传文件的路径

	help = false // 是否显示帮助信息
)

// upload函数用于上传文件到OSS
// 参数:
// - file_path: 待上传文件的本地路径
// 返回值:
// - error: 上传过程中可能出现的错误
func upload(file_path string) error {
	// 创建OSS客户端
	client, err := oss.New(endpint, acessKey, acessSecret)
	if err != nil {
		return err
	}

	// 获取指定的Bucket对象
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		return err
	}

	// 执行文件上传
	if err := bucket.PutObjectFromFile(file_path, file_path); err != nil {
		return err
	}

	// 生成并获取文件的下载URL
	downloadURL, err := bucket.SignURL(file_path, oss.HTTPGet, 60*60*24)
	if err != nil {
		return err
	}
	// 打印文件下载URL
	fmt.Printf("文件下载URL: %s \n", downloadURL)
	fmt.Println("请在1天之内下载.")
	return nil

}

// validate函数用于检查必要的参数是否已设置
// 返回值:
// - error: 参数检查中可能出现的错误
func validate() error {
	// 检查Endpoint、AccessKey ID和AccessKey Secret是否为空
	if endpint == "" || acessKey == "" || acessSecret == "" {
		return fmt.Errorf("endpoint, access_key access_secret has one empty")
	}

	// 检查待上传文件路径是否为空
	if uploadFile == "" {
		return fmt.Errorf("upload file path required")
	}

	return nil
}

// loadParams函数用于加载和解析命令行参数
func loadParams() {
	// 定义并设置命令行参数
	flag.BoolVar(&help, "h", false, "打印帮助信息")
	flag.StringVar(&uploadFile, "f", "", "上传文件的名称")
	flag.Parse()

	// 如果用户请求帮助信息，则显示并退出
	if help {
		usage()
		os.Exit(0)
	}
}

// usage函数用于打印帮助信息
func usage() {
	fmt.Fprintf(os.Stderr, `cloud-station version: 0.0.1
Usage: cloud-station [-h] -f <uplaod_file_path>
Options:
`)

	flag.PrintDefaults()
}

// main函数作为程序的入口点
func main() {
	// 加载命令行参数
	loadParams()

	// 参数校验
	if err := validate(); err != nil {
		fmt.Printf("参数校验异常: %s\n", err)
		usage()
		os.Exit(1)
	}

	// 执行文件上传操作
	if err := upload(uploadFile); err != nil {
		fmt.Printf("上传文件异常: %s\n", err)
		os.Exit(1)
	}

	// 上传成功，打印提示信息
	fmt.Printf("文件: %s 上传完成\n", uploadFile)
}
